www.gusucode.com > VC++ SMS 串口的阻塞模式短信彩信的收发-源码程序 > VC++ SMS 串口的阻塞模式短信彩信的收发-源码程序/code/SMS/ComSms.cpp

    //Download by http://www.NewXing.com

#include <stdio.h>
#include "ComSms.h"
#include "Comm.h"
#include "Sms.h"
#include "SmsTraffic.h"
#include "myxmodem.h"

#define CTRLZ 26

#define CheckRet(nRet)			\
{								\
	if(nRet == FALSE)			\
	{							\
		return nRet;			\
	}							\
}	

CSmsTraffic* g_pSmsTraffic = NULL;
char g_szSMSC[20] = {0};
char g_szPhone[20] = {0};

DLL_API BOOL	COM_Open(const char* szComName)
{
	return OpenComm(szComName);
}

//////////////////////////////////////////////////////////////////////////
DLL_API BOOL	COM_Open1(const char* szComName, int nBaudRate, int nParity, int nByteSize, int nStopBits)
{
	return OpenComm(szComName, nBaudRate, nParity, nByteSize, nStopBits);
}

//////////////////////////////////////////////////////////////////////////
DLL_API BOOL	COM_Close()
{
	return CloseComm();
}

//////////////////////////////////////////////////////////////////////////
DLL_API BOOL	COM_SMS_Init()
{
	BOOL nRet = gsmInit();

	if ( nRet == TRUE )
	{
		g_pSmsTraffic = new CSmsTraffic();
			if ( NULL == g_pSmsTraffic )
				return FALSE;
	}

	return nRet;
}

//////////////////////////////////////////////////////////////////////////
DLL_API BOOL    COM_SMS_Uninit()
{
	if ( g_pSmsTraffic != NULL )
	{
		delete g_pSmsTraffic;
		g_pSmsTraffic = NULL;
	}

	return TRUE;
}

//////////////////////////////////////////////////////////////////////////
DLL_API BOOL	COM_SMS_SetAddr(const char* szSMSC, const char* szPhone)
{
	if ( NULL == szSMSC )
		return FALSE;
	
	int iLen = strlen(szSMSC);
	if ( iLen > 20 )
		return FALSE;
	
	strcpy(g_szSMSC, szSMSC);
	
	if ( szPhone != NULL )
	{
		iLen = strlen(szPhone);
		if ( iLen > 20 )
			return FALSE;
		
		strcpy(g_szPhone, szPhone);
	}
	
	return TRUE;
}

//////////////////////////////////////////////////////////////////////////
DLL_API BOOL	COM_SMS_SendText(const char* szText, const char* szPhone, bool bWait)
{
	BOOL nRet = FALSE;

	// 检查短消息内容是否空,或者超长
	WCHAR wchar[1024];
	int nCount = ::MultiByteToWideChar(CP_ACP, 0, szText, -1, wchar, 1024);
	if(nCount <= 1)
	{
		return nRet;
	}
	else if(nCount > 70)		// 我们决定全部用UCS2编码,最大70个字符(半角/全角)
	{
		return nRet;
	}
	
	SM_PARAM SmParam;
	
	memset(&SmParam, 0, sizeof(SM_PARAM));
	
	// 填充短消息结构
	strcpy(SmParam.SCA, g_szSMSC);
	if ( NULL == szPhone )
		strcpy(SmParam.TPA, g_szPhone);
	else
		strcpy(SmParam.TPA, szPhone);
	
	strcpy(SmParam.TP_UD, szText);
	SmParam.TP_PID = 0;
	SmParam.TP_DCS = GSM_UCS2;
	
	// 发送短消息
	if ( g_pSmsTraffic != NULL )
	{
		g_pSmsTraffic->PutSendMessage(&SmParam);
		if ( bWait )
		{
			nRet = g_pSmsTraffic->GetSendMsgResult();
			nRet = nRet == GSM_OK ? TRUE : FALSE;
		}
		else
			nRet = TRUE;
	}
	
	return nRet;
}

//////////////////////////////////////////////////////////////////////////
BOOL	COM_SMS_SetReadFun(COM_SMS_ReadFUN funReadSMS)
{
	if ( g_pSmsTraffic != NULL )
	{
		g_pSmsTraffic->SetReadSMSFun(funReadSMS);
		return TRUE;
	}
	return FALSE;
}

//////////////////////////////////////////////////////////////////////////
BOOL WaitResponse(void)
{
	unsigned long wCount;
	char Recvbuf[100];
	BOOL flag = FALSE;

	wCount=0;
	while( flag == FALSE )
	{
		wCount = ReadComm(Recvbuf, 100);
		Recvbuf[wCount]='\0';
		
		Sleep(100);

		if(strstr(Recvbuf,"OK")!=NULL || strstr(Recvbuf,">")!=NULL ||strstr(Recvbuf,"Ok")!=NULL||strstr(Recvbuf,"MMSTRACE")!=NULL)
		{
			flag = TRUE;
			break;
		}

		wCount=0;

		if(strstr(Recvbuf,"ERROR")!=NULL)
			return FALSE;
	}

	return flag;
}

//////////////////////////////////////////////////////////////////////////
BOOL SendATC(char *sendbuf)
{
	unsigned long wCount;
	BOOL flag = FALSE;
	
	wCount = WriteComm(sendbuf,strlen(sendbuf));
	flag = WaitResponse();

	return flag;
}

//////////////////////////////////////////////////////////////////////////
BOOL	COM_MMS_Config()
{
	BOOL bReturn = FALSE;
	
	bReturn = SendATC("at$mmsbearer=1,\"cmwap\",,\r");
	if(!bReturn)
		return bReturn;
	
	bReturn = SendATC("at$mmsproxy=\"10.0.0.172\",80\r");
	if(!bReturn)
		return bReturn;
	
	bReturn = SendATC("at$mmscommmode=2\r");
	if(!bReturn)
		return bReturn;
	
	//at$mmscurl="http://mmsc.monternet.com"
	bReturn = SendATC("at$mmscurl=\"http://mmsc.monternet.com\"\r");
	if(!bReturn)
		return bReturn;
	
	//at$fdel="*"
	bReturn = SendATC("at$fdel=\"*\"\r\n");

	return bReturn;
	
}

//////////////////////////////////////////////////////////////////////////
void changetounicode(char *buf,char *src)
{
	WCHAR *tempbuf ;
	int i,nLen;
	nLen = MultiByteToWideChar(CP_ACP, 0,src, -1, NULL, NULL);
	tempbuf= new WCHAR[nLen];
	MultiByteToWideChar(CP_ACP, 0,src, -1, tempbuf, nLen);
	for(i=0;i<nLen-1;i++)
		sprintf(buf+4*i,"%04lx",tempbuf[i]);
	delete [] tempbuf;
	sprintf(buf+4*i,"%c",CTRLZ);
	return;
}
//////////////////////////////////////////////////////////////////////////
BOOL	COM_SMS_SendMMS(const char* szTitle, const char* szText, const char* szFileName, const char* szPhone)
{
	char Sendbuf[4000];	
	char title[100];
	char Message[1000];

	strcpy(title, szTitle);
	strcpy(Message, szText);

	BOOL nRet = COM_MMS_Config();

	//at$fdel="*"
	sprintf(Sendbuf,"at$fdel=\"*\"\r\n");
	nRet = SendATC(Sendbuf);
	
	char temp[100];
	char filename[100];
	unsigned char *buf = NULL; 
	unsigned long length;
	int s = 0;
	int n = 0;
	
	strcpy(filename, szFileName);
	
	sprintf(temp,"%c%s", 97, filename);
	sprintf(Sendbuf,"at$fupl=\"a%s\"\r\n", filename);
	nRet = SendATC(Sendbuf);
	
	FILE* fp=fopen(filename, "rb");
	if(fp==NULL)
	{
		return false;
	}
	fseek(fp,0,2);
	length=ftell(fp);
	buf=(unsigned char *)malloc(length);
	fseek(fp,0,0);
	s=0;
	while(!feof(fp))
	{
		n=fread(buf+s,sizeof(char),100,fp);
		s=s+n;
	}
	
	myxmodem *mytran = new myxmodem();
	if ( mytran != NULL )
	{
		int iRet = mytran->send_packet_data(buf,length);
		nRet = WaitResponse();
		
		delete mytran;
		mytran = NULL;
	}
	
	free(buf);
	fclose(fp);


	//at$mmsw=0 
	sprintf(Sendbuf,"at$mmsw=0\r\n");
	nRet = SendATC(Sendbuf);
	CheckRet(nRet);
	
	//at$mmscs="UCS2"
	sprintf(Sendbuf,"at$mmscs=\"UCS2\"\r\n");
	nRet = SendATC(Sendbuf);
	CheckRet(nRet);
		
	//at$mmsw=1,1
	sprintf(Sendbuf,"at$mmsw=1,1\r\n");
	nRet = SendATC(Sendbuf);
	CheckRet(nRet);
	
	sprintf(Sendbuf,"%s%c",szPhone,CTRLZ);
	nRet = SendATC(Sendbuf);
	CheckRet(nRet);

	//at$mmsw=4,1
	sprintf(Sendbuf,"at$mmsw=4,1\r\n");
	nRet = SendATC(Sendbuf);
	CheckRet(nRet);
	changetounicode(Sendbuf,title);
	nRet = SendATC(Sendbuf);
	CheckRet(nRet);

	//at$mmsw=5,1,1
	sprintf(Sendbuf,"at$mmsw=5,1,1\r\n");
	nRet = SendATC(Sendbuf);
	CheckRet(nRet);
	changetounicode(Sendbuf,Message);
	//	sprintf(Sendbuf,"%s%c",Message,CTRLZ);
	nRet = SendATC(Sendbuf);
	CheckRet(nRet);
	
// 	//at$mmsw=6,1,"a111.jpg"
// 	sprintf(Sendbuf,"at$mmsw=6,%d,\"%s\"\r\n", 0, LPCTSTR(szFileName));
// 	nRet = SendATC(Sendbuf);
// 	CheckRet(nRet);
// 
// 	nRet = COM_MMS_AddPageFile(0, Message, szFileName);
// 	CheckRet(nRet);
	//上传
	{
	
		//把上传文件加入彩信
		sprintf(temp, "at$mmsw=6,1,\"a%s\"\r\n", filename);
		nRet = SendATC(temp);
		CheckRet(nRet);

	}

	//At$mmssend
	sprintf(Sendbuf,"at$mmssend\r\n");
	nRet = SendATC(Sendbuf);
	CheckRet(nRet);

	return TRUE;
}

//////////////////////////////////////////////////////////////////////////